%-------------------------------------------------------------------------------

% This file is part of code_saturne, a general-purpose CFD tool.
%
% Copyright (C) 1998-2025 EDF S.A.
%
% This program is free software; you can redistribute it and/or modify it under
% the terms of the GNU General Public License as published by the Free Software
% Foundation; either version 2 of the License, or (at your option) any later
% version.
%
% This program is distributed in the hope that it will be useful, but WITHOUT
% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
% FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
% details.
%
% You should have received a copy of the GNU General Public License along with
% this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
% Street, Fifth Floor, Boston, MA 02110-1301, USA.

%-------------------------------------------------------------------------------

\programme{gradrc}\label{ap:gradrc}

\vspace{1cm}
%-------------------------------------------------------------------------------
\section*{Fonction}
%-------------------------------------------------------------------------------

Le but de ce sous-programme est de calculer, au centre des cellules, le gradient
d'une fonction scalaire, également connue au centre des cellules.
Pour obtenir la valeur du gradient, une méthode itérative de
reconstruction pour les maillages non orthogonaux est mise en
\oe uvre~: elle fait appel à un développement limité d'ordre 1 en espace
sur la variable, obtenu à partir de la
valeur de la fonction et de son gradient au centre de la cellule. Cette
méthode,
choisie comme option par défaut, correspond à \var{imrgra}\,=\,0 et est utilisée pour le calcul
des gradients de toutes les grandeurs.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section*{Discrétisation}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

La méthode est décrite \'a la section~\ref{sec:spadis:iteratif_gradient}.

\minititre{Remarque}
Pour les conditions aux limites en pression, un traitement particulier est mis
en  \oe uvre, surtout utile dans les cas où un gradient de pression (hydrostatique
ou autre) nécessite une attention spécifique aux bords, où une condition
à la limite de type Neumann homogène est généralement inadaptée. Soit
$P_{F_{\,b_{\,ik}}}$ la  valeur de la pression à la face associée, que
l'on veut calculer.

On note que ~:
\begin{equation}\notag
\vect{I'F}_{\,b_{\,ik}} \,.\,(\grad P)_I = \vect{I'F}_{\,b_{\,ik}}
\,.\,\vect{G}_{\,c,i} = \overline{I'F}_{\,b_{\,ik}} \,.\left. \displaystyle\frac{\delta P}{\delta
n}\right|_{F_{\,b_{\,ik}}}
\end{equation}
avec les conventions précédentes.\\
\paragraph{\bf Sur maillage orthogonal }
On se place dans le cas d'un maillage orthogonal , {\it i.e.} pour
toute cellule $\Omega_I$, $I$ et son projeté $I'$ sont identiques.
Soit $M_{\,b_{\,ik}}$ le milieu du segment $IF_{\,b_{\,ik}}$.\\
On peut écrire les égalités suivantes~:
\begin{equation}\notag
\begin{array}{ll}
P_{F_{\,b_{\,ik}}} & = P_{M_{\,b_{\,ik}}} + \overline{M_{\,b_{\,ik}}F_{\,b_{\,ik}}}\,.\left. \displaystyle\frac{\delta P}{\delta
n}\right|_{M_{\,b_{\,ik}}} +
\overline{M_{\,b_{\,ik}}F_{\,b_{\,ik}}}^{\,2}\,.\left.\displaystyle\frac{1}{2}\frac{{\delta}^{2} P}{\delta
n^2}\right|_{M_{\,b_{\,ik}}} + \mathcal{O}(h^3)\\
P_I & = P_{M_{\,b_{\,ik}}} + \overline{M_{\,b_{\,ik}}I}\,.
\left. \displaystyle\frac{\delta P}{\delta n}\right|_{M_{\,b_{\,ik}}} +
\overline{M_{\,b_{\,ik}}I}^{\,2}\,.\left.\displaystyle\frac{1}{2}
\frac{{\delta}^{2} P}{\delta n^2}\right|_{M_{\,b_{\,ik}}} + \mathcal{O}(h^3)
\end{array}
\end{equation}
avec $\overline{M_{\,b_{\,ik}}I} = - \overline{M_{\,b_{\,ik}}F_{\,b_{\,ik}}}$.\\
On obtient donc~:
\begin{equation}\label{Base_Gradrc_eq_orthogonal}
P_{F_{\,b_{\,ik}}} - P_I = \overline{IF}_{\,b_{\,ik}}\,.\left. \displaystyle\frac{\delta P}{\delta
n}\right|_{M_{\,b_{\,ik}}} + \mathcal{O}(h^3)
\end{equation}
Grâce à la formule des accroissements finis :
\begin{equation}\label{Base_Gradrc_eq_derivee_normale}
\left. \displaystyle\frac{\delta P}{\delta n}\right|_{M_{\,b_{\,ik}}} =
\displaystyle\frac{1}{2}\left[\left. \displaystyle\frac{\delta P}{\delta
n}\right|_{I} +  \left. \displaystyle\frac{\delta P}{\delta
n}\right|_{F_{\,b_{\,ik}}}\right] + \mathcal{O}(h^2)
\end{equation}\\
On s'intéresse aux cas suivants :\\\\
\hspace*{0.5cm}{ $\bullet${\underline { condition à la limite de type Dirichlet}}}\\
$P_{F_{\,b_{\,ik}}} = P_{IMPOSE}$, aucun traitement particulier\\\\
\hspace*{0.5cm}{ $\bullet ${\underline { condition à la limite de type Neumann
homogène}}}\\
On veut imposer :
\begin{equation}
\left. \displaystyle\frac{\delta P}{\delta n}\right|_{F_{\,b_{\,ik}}} = 0 + \mathcal{O}(h)
\end{equation}
On a~:
\begin{equation}\notag
\left. \displaystyle\frac{\delta P}{\delta n}\right|_{I} =
\displaystyle\left. \displaystyle\frac{\delta P}{\delta
n}\right|_{F_{\,b_{\,ik}}} + \mathcal{O}(h)
\end{equation}
et comme :
\begin{equation}
P_{F_{\,b_{\,ik}}} = P_I + \overline{IF}_{\,b_{\,ik}}\,.\left. \displaystyle\frac{\delta P}{\delta
n}\right|_I + \mathcal{O}(h^2)
\end{equation}
on en déduit :
\begin{equation}
P_{F_{\,b_{\,ik}}} = P_I + \overline{IF}_{\,b_{\,ik}}\,.\left. \displaystyle\frac{\delta P}{\delta
n}\right|_{F_{\,b_{\,ik}}} + \mathcal{O}(h^2)
\end{equation}
soit~:
\begin{equation}
P_{F_{\,b_{\,ik}}} = P_I +  \mathcal{O}(h^2)
\end{equation}
On obtient donc une approximation d'ordre 1.\\
\paragraph{\bf Sur maillage non orthogonal}
Dans ce cas, on peut seulement écrire~:\\
\begin{equation}
P_{F_{\,b_{\,ik}}}  = P_{I'} +
\displaystyle\frac{1}{2}\,\vect{I'F}_{\,b_{\,ik}}\,.\,[\,(\grad P)_{I'} + (\grad
P)_{F_{\,b_{\,ik}}}\,] + \mathcal{O}(h^3)
\end{equation}
\hspace*{0.5cm}{ $\bullet ${\underline { condition à la limite de type Dirichlet}}\\
$P_{F_{\,b_{\,ik}}} = P_{IMPOSE}$, toujours aucun traitement particulier\\\\
\hspace*{0.5cm}{ $\bullet ${\underline { condition à la limite de type Neumann
homogène}}}\\
On veut :
\begin{equation}
\left. \displaystyle\frac{\delta P}{\delta n}\right|_{F_{\,b_{\,ik}}} = 0 + \mathcal{O}(h)
\end{equation}
ce qui entra\^\i ne :
\begin{equation}\label{Base_Gradrc_eq_ortho}
\vect{I'F}_{\,b_{\,ik}} \,.\,(\grad P)_{F_{\,b_{\,ik}}} = \mathcal{O}(h^2)
\end{equation}
On peut écrire :
\begin{equation}\notag
(\grad P)_{I'} = (\grad P)_{F_{\,b_{\,ik}}} +  \mathcal{O}(h)
\end{equation}
d'où~:
\begin{equation}
P_{F_{\,b_{\,ik}}} = P_{I'}  + \mathcal{O}(h^2)
\end{equation}
On obtient donc une approximation d'ordre 1.\\

\hspace*{0.5cm}{\bf $\bullet $ Conclusion }\\
On peut récapituler toutes ces situations {\it via} la formule :
\begin{equation}\notag
P_{F_{\,b_{\,ik}}}\,=\,P_{I'}
\end{equation}

